//配置路由的地方
import Vue from "vue"
import VueRouter from "vue-router"
Vue.use(VueRouter)

//引入store
import store from "@/store"


//重写push | replace ————解决编程式导航多次跳转路由NavigationDuplicated警告错误
//先把VueRouter原型对象的push，先保存一份
const OrginPush = VueRouter.prototype.push;
//先把VueRouter原型对象的replace，先保存一份
const OrginReplace = VueRouter.prototype.replace;

//重写push
VueRouter.prototype.push = function(location,reslove,reject){
  if(reslove&&reject){
    OrginPush.call(this,location,reslove,reject)
  }else {
    OrginPush.call(this,location,()=>{},()=>{})
  }
}
//重写replace
VueRouter.prototype.replace = function(location,reslove,reject){
  if(reslove&&reject){
    OrginReplace.call(this,location,reslove,reject)
  }else {
    OrginReplace.call(this,location,()=>{},()=>{})
  }
}

//引入路由配置信息
import routes from "@/router/routes"


//配置路由
const router = new VueRouter({
  routes,
  scrollBehavior(to,from,savedPosition){
    // 始终滚动到顶部
    return { y: 0 }
  }
})

router.beforeEach(
  async(to,from,next)=>{   
      //拿到token
      let token = store.state.user.token
      //拿到用户名
      let userName = store.state.user.userInfo.name
      //首先分为两种情况，有token和没有token的
      if(token){
        //如果有token了就不让去home了
        if(to.path=="/login" || to.path=="/register"){
          next("/home")
        }else {
          //如果去的是其它页面，也要进行判断，判断它是否有用户名,没有的话发送请求，有了用户名才能放行
          if(userName){
            next()
          }else {
          //如果没有用户名
           try {
            //发请求获取用户信息
            await store.dispatch("user/getUserInfo")
            //获取用户信息成功才放行
            next()
           }catch {
            alert("请求用户信息失败")
            //一般就是token失效，所以发不了请求
            //这里把token删掉，然后把用户送回login重新登陆获取token
            await store.dispatch("user/getLoginOut")
            next("/login")
           }
          }
        }
      }else {
        //未登录的情况下不能去以下页面：trade、pay、paysuccess、center
        let toPath = to.path
        if(toPath =="/trade" || toPath =="/pay" || toPath =="/paysuccess" ||toPath =="/center"){
          next("/login?redirect="+toPath)
        }else {
          next()
        }
      }
  }
)

export default router